package fr.generali.accueilclient.gwt.client.ui.components.popup;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;

import fr.generali.accueilclient.gwt.client.ui.components.form.button.ButtonBar;

/**
 * Une {@link DialogBox} offrant les fonctionnalités suivantes :
 * 
 * - Un espace réservé au contenu.
 * 
 * - Une barre {@link ButtonBar} r�serv�e aux boutons.
 * 
 * Le but est d'offrir une boite de dialogue pr�te � l'emploi.
 * 
 * @author M. Abdennebi 13 avr. 2012
 * 
 */
public class PopupBox extends DialogBox {

	/**
	 * L'espace qui contient la View fournie par le développeur.
	 */
	protected SimplePanel content;

	protected ButtonBar buttonBar;
	
	private Resources res = GWT.create(Resources.class);

	public PopupBox() {
		this(false);
	}
	
	public PopupBox(boolean autoHide) {
		this(autoHide, true);
	}
	
	public PopupBox(boolean autoHide, boolean modal) {
		this(autoHide, modal, new CaptionWithCancel());
	}

	public PopupBox(boolean autoHide, boolean modal, Caption captionWidget) {
		super(autoHide, modal, captionWidget);
		FlowPanel flowPanel = new FlowPanel();
		content = new SimplePanel();
		buttonBar = new ButtonBar();
		buttonBar.setStyleName(res.style().buttonBar());
		flowPanel.add(content);
		flowPanel.add(buttonBar);
		// Attention on appel le setWidget du parent sinon on appel le setWidget
		// redéfini.
		super.setWidget(flowPanel);
		
		res.style().ensureInjected();
		
		
	}
	
	/*
	 * Lorsqu'on clique sur la croix pour fermer la dialogbox
	 */
	protected void onLoad() {
		super.onLoad();
		// Ce cast est possible car : this(autoHide, modal, new CaptionWithCancel());
		((CaptionWithCancel)getCaption()).addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				hide();
			}
		});
	}

	@Override
	public void setWidget(Widget widget) {
		content.add(widget);
	}

	public ButtonBar getButtonBar() {
		return buttonBar;
	}

	/* 
	 * Lorsqu'on appuye sur le bouton Escape.
	 */
	@Override
	protected void onPreviewNativeEvent(NativePreviewEvent event) {
		super.onPreviewNativeEvent(event);
		switch (event.getTypeInt()) {
		case Event.ONKEYDOWN:
			if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) {
				hide();
			}
			break;
		}
	}

}
